#include "mainwindow.h"
#include "fileutils.h"
#include "genetic_algorithm.h"
#include "floyd_warshall.h"
#include "spfa.h"
#include "location_search.h"  // 包含字符匹配头文件
#include <iostream>
#include <QApplication>
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QTextStream>
#include <QVector>
#include <QString>
#include <QDebug>
#include <QMap>
#include "dijkstra.h"  // 包含Dijkstra头文件
#include "ant_colony_optimization.h"
#include "queue_network.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    // QString csvFilePath = ":/resources/final_adjacency_matrix.csv";
    // QString jsonFilePath = ":/resources/output.json";

    // QVector<QVector<QString>> csvData = readCsvFile(csvFilePath);
    // QMap<QString, QVector<double>> geoData = readJsonFile(jsonFilePath);

    // // 转换CSV数据为距离矩阵
    // QVector<QVector<double>> distanceMatrix = convertToDistanceMatrix(csvData);

    // // // 地点名称列表，可以从CSV或其他数据源中提取
    // QVector<QString> locations;
    // int i = 0;
    // for (const auto& row : csvData) {
    //     if(i> 30){
    //         locations.append(row[0]);
    //     }
    //     i++;
    // }
    // distanceMatrix = floyd(distanceMatrix);
    // QVector<QVector<double>> InterestMatrix = convertToInterestMatrix(distanceMatrix);
    // QueueNetwork network(InterestMatrix, locations,10.0);
    // network.calculateTraffic();
    // network.calculateQueueMetrics();
    // network.displayResults();

    return a.exec();
}






// // 示例：搜索故宫地点提示
// QString userInput = "源故";  // 用户输入的地点名称

// // 调用findAndDisplayLocations函数来搜索和显示结果
// findAndDisplayLocations(userInput, locations);

// int startNode = 1; // 起点
// int endNode = 35;   // 终点

// distanceMatrix = floyd(distanceMatrix);
// QVector<QVector<double>> InterestMatrix = convertToInterestMatrix(distanceMatrix);
// // GeneticAlgorithm ga(distanceMatrix, 100, 3000, 0.05);



// // 求解TSP问题
// Individual bestSolution = ga.solve();

// qDebug() << "Best path:";
// for (int city : bestSolution.path) {
//     qDebug() << csvData[0][city + 1];  // 输出地名
// }
// qDebug() << "Total distance:" << 1.0 / bestSolution.fitness;
// 初始化蚁群算法参数
// int numAnts = 10;
// int generations = 100;
// double alpha = 1.0;
// double beta = 5.0;
// double evaporationRate = 0.5;

// 创建蚁群算法对象
// AntColonyOptimization aco(InterestMatrix, numAnts, generations, alpha, beta, evaporationRate);

// // 运行算法并获取最优路径
// QVector<int> bestPath = aco.solve();

// // 输出最优路径
// qDebug() << "Best path:" << bestPath;
// qDebug() << "Best path:";
// for (int city : bestPath) {
//     qDebug() << csvData[0][city + 1 + 30];  // 输出地名
// }


// SPFAResult result = spfa(distanceMatrix, startNode, endNode);

// qDebug() << "Shortest distance from" << startNode << "to" << endNode << ":" << result.distances[endNode];
// qDebug() << "Shortest path from" << startNode << "to" << endNode << ":" << getPath(result.predecessors, startNode, endNode);

    // // 使用Floyd-Warshall算法计算最短路径
    // floydWarshall(distanceMatrix);

    // // 输出点与点之间的最短距离矩阵
    // for (int i = 0; i < distanceMatrix.size(); ++i) {
    //     for (int j = 0; j < distanceMatrix[i].size(); ++j) {
    //         qDebug() << "Distance from" << i << "to" << j << ":" << distanceMatrix[i][j];
    //     }
    // }


    // // 计算连通分支并输出其序号
    // QVector<int> component(distanceMatrix.size(), -1);
    // int connectedComponents = countConnectedComponents(distanceMatrix, component);
    // qDebug() << "Number of connected components:" << connectedComponents;

    // // 输出各个连通分支的节点
    // for (int i = 0; i < connectedComponents; ++i) {
    //     qDebug() << "Component" << i << ":";
    //     for (int j = 0; j < component.size(); ++j) {
    //         if (component[j] == i) {
    //             qDebug() << j;  // 输出节点序号
    //         }
    //     }
    // }


